#ifndef FILEINFOTAB_H
#define FILEINFOTAB_H

#include <QWidget>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QMenu>
#include <QAction>
#include <QClipboard>
#include <memory>
#include "dataspecification_def.h"

/**
 * @brief FileInfoTab 类用于显示和管理文件头信息的界面组件
 * 
 * 该类提供文件基本信息的展示，包括文件长度、版本号、创建时间、站点信息等
 */
class FileInfoTab : public QWidget
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父窗口指针
     */
    explicit FileInfoTab(QWidget *parent = nullptr);
    
    /**
     * @brief 析构函数
     */
    virtual ~FileInfoTab();

public:
    /**
     * @brief 设置文件长度
     * @param length 文件长度值
     */
    void setFileLen(qint32 length);

    /**
     * @brief 设置规范版本号
     * @param dataFileVersion 版本号字符串
     */
    void setVersion(const QString& dataFileVersion);

    /**
     * @brief 设置文件生成时间
     * @param date 文件生成时间的字符串表示，格式为 "YYYYMMDDhhmmssfff"
     */
    void setCreateDate(const QString& date);

    /**
     * @brief 设置站点名称
     * @param name 站点名称的字符串
     */
    void setStationName(const QString& name);

    /**
     * @brief 设置站点编码
     * @param no 站点编码值
     */
    void setStationNum(const QString& no);

    /**
     * @brief 设置天气
     * @param eWeather 天气类型枚举值
     */
    void setWeather(DataSpecificationGW::Weather eWeather);

    /**
     * @brief 设置温度
     * @param temperature 温度的浮点数值
     */
    void setTemperature(float temperature);

    /**
     * @brief 设置湿度
     * @param humidity 湿度的整数值 (0-100)
     */
    void setHumidity(int humidity);

    /**
     * @brief 设置仪器厂家
     * @param deviceCompany 仪器厂家的字符串
     */
    void setDeviceCompany(const QString& deviceCompany);

    /**
     * @brief 设置仪器型号
     * @param deviceModel 仪器型号的字符串
     */
    void setDeviceModel(const QString& deviceModel);

    /**
     * @brief 设置仪器版本号
     * @param qstrInstrumentVersion 仪器版本号字符串
     */
    void setDeviceVersion(const QString& qstrInstrumentVersion);

    /**
     * @brief 设置仪器序列号
     * @param serialNumber 仪器序列号的字符串
     */
    void setSerialNumber(const QString& serialNumber);

    /**
     * @brief 设置系统频率
     * @param frequency 系统频率的整数值 (Hz)
     */
    void setFrequency(int frequency);

    /**
     * @brief 设置图谱数量
     * @param chatNum 图谱数量的整数值
     */
    void setChatNumber(int chatNum);

    /**
     * @brief 设置经度
     * @param longitude 经度值 (-180 至 180 度)
     */
    void setLongitude(double longitude);

    /**
     * @brief 设置纬度
     * @param latitude 纬度值 (-90 至 90 度)
     */
    void setLatitude(double latitude);

    /**
     * @brief 设置海拔
     * @param altitude 海拔值 (米)
     */
    void setAltitude(int altitude);
    
    /**
     * @brief 清空表格数据
     */
    void clearTable();
    
    /**
     * @brief 导出表格数据到文件
     * @param filePath 导出文件路径
     * @return 是否导出成功
     */
    bool exportToFile(const QString& filePath);
    
    /**
     * @brief 获取文件信息的摘要说明
     * @return 包含主要文件信息的摘要字符串
     */
    QString getSummary() const;

private slots:
    /**
     * @brief 右键菜单处理
     * @param pos 鼠标位置
     */
    void onCustomContextMenu(const QPoint& pos);
    
    /**
     * @brief 复制选中单元格内容
     */
    void copySelectedCells();
    
    /**
     * @brief 复制整行内容
     */
    void copyRow();
    
    /**
     * @brief 复制所有内容
     */
    void copyAllData();
    
private:
    /**
     * @brief 创建表格项
     * @param text 表格项文本内容
     * @return 创建的表格项指针
     */
    QTableWidgetItem* createTableWidgetItem(const QString &text);
    
    /**
     * @brief 初始化界面和控件
     */
    void initUI();
    
    /**
     * @brief 初始化右键菜单
     */
    void initContextMenu();
    
    /**
     * @brief 日志记录
     * @param message 日志消息
     */
    void logMessage(const QString& message);

private:
    QTableWidget* m_pTable;
    QMenu* m_contextMenu;
    QAction* m_copyAction;
    QAction* m_copyRowAction;
    QAction* m_copyAllAction;
    QAction* m_exportAction;
    
    // 存储当前数据，方便导出和摘要获取
    struct FileInfoData {
        qint32 fileLength;
        QString version;
        QString createDate;
        QString stationName;
        QString stationNum;
        DataSpecificationGW::Weather weather;
        float temperature;
        int humidity;
        QString deviceCompany;
        QString deviceModel;
        QString deviceVersion;
        QString serialNumber;
        int frequency;
        int chartNumber;
        double longitude;
        double latitude;
        int altitude;
    };
    
    std::unique_ptr<FileInfoData> m_data;
};

#endif // FILEINFOTAB_H
